سؤال

أنا أعمل على تطبيق SharePoint حيث أحتاج إلى تشغيله SP.RequestExecutor.executeAsync() من أجل الحصول على بعض المعلومات من إحدى قوائم الويب المضيف.اعتمادًا على طريقة الاتصال بمكالمة oData، أريد أن أفعل شيئًا مختلفًا.

للأسف، executor.executeAsync() لا يلعب بشكل لطيف مثل $.ajax() يفعل من حيث الاستخدام $.when().done() وتنفيذ التعليمات البرمجية بعد يتم إجراء مكالمة غير متزامنة.فيما يلي بعض التعليمات البرمجية إذا كنت ترغب في رؤيتها:

    load = function (){
        $.when(getEntries()).done(function () {
            ViewModels.Calendar.addEventSource(ko.utils.unwrapObservable(eventList));
        });
    }

    getEntries = function () {
        return executor.executeAsync({
            url: appweburl
                + "/_api/SP.AppContextSite(@target)/web/lists/getbytitle('" + LIST + "')/items?@target='" + hostweburl
                + "'&$select=Title,OData__x006e_ot5,qnlu,OData__x0066_x20"
                + "&$filter=OData__x0066_x20 eq '" + ViewModels.Person.user.userName() + "' "
                + "and qnlu ge DateTime'" + startDate().toString("yyyy-MM-dd") + "T00:00:00' "
                + "and qnlu le DateTime'" + endDate().toString("yyyy-MM-dd") + "T00:00:00' ",
            method: "GET",
            headers: { "Accept": "application/json; odata=verbose" },
            success: onGetEntriesSuccess,
            error: onoDataCallFailure 
        });
    },

    onGetEntriesSuccess = function (data) {
        var jsonObject = JSON.parse(data.body);
        $.each(jsonObject.d.results, function (index, item) {
            eventList.push(new Event(item.qnlu, item.OData__x006e_ot5));
        });
    },

    onoDataCallFailure = function (data, errorCode, errorMessage) {
        alert('Failed to get host site. Error:' + errorMessage);
    };

سيكون موضع تقدير أي أفكار / اقتراحات.

هل كانت مفيدة؟

المحلول

إنشاء .مؤجل جديد.قم بإرجاع Deferred.promise من المكالمة.اتصل بـ Deferred.resolve أو Deferred.Reject في معالجات النجاح والفشل.

نصائح أخرى

لإضافة بعض التفاصيل إلى إجابة سكوت، يمكنك القيام بشيء مثل هذا:

function load () {
    var call = getEntries();
    call.done(function (eventList) {
        ViewModels.Calendar.addEventSource(ko.utils.unwrapObservable(eventList));
    });
}

function getEntries () {
    // create the deferred object
    var def = new $.Deferred();

    executor.executeAsync({
        url: appweburl
            + "/_api/SP.AppContextSite(@target)/web/lists/getbytitle('" + LIST + "')/items?@target='" + hostweburl
            + "'&$select=Title,OData__x006e_ot5,qnlu,OData__x0066_x20"
            + "&$filter=OData__x0066_x20 eq '" + ViewModels.Person.user.userName() + "' "
            + "and qnlu ge DateTime'" + startDate().toString("yyyy-MM-dd") + "T00:00:00' "
            + "and qnlu le DateTime'" + endDate().toString("yyyy-MM-dd") + "T00:00:00' ",
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        success: onGetEntriesSuccess,
        error: onoDataCallFailure 
    });

    function onGetEntriesSuccess (data) {
        var jsonObject = JSON.parse(data.body);
        var eventList = [];
        $.each(jsonObject.d.results, function (index, item) {
            eventList.push(new Event(item.qnlu, item.OData__x006e_ot5));
        });

        // resolve the deferred object
        // eventList will be passed as parameter to done
        def.resolve(eventList);
    }

    function onoDataCallFailure (data, errorCode, errorMessage) {
        // reject the deferred object            
        def.reject('Failed to get host site. Error:' + errorMessage);
    }

    // return the promise
    return def.promise();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى sharepoint.stackexchange
scroll top