簡體   English   中英

如何“承諾”(或回調)此代碼

[英]How to “Promise” (or callback) this code

我的Sharepoint中有2個列表:演講和學校。
在我的演講表格中,我有一個學校領域。 我想使用學校列表中的值(名稱,地址,城市)自動填寫此字段。
這是我的代碼:

$(School_fieldID).autocomplete({
    minLength: 2,
    source: function (request, response) {
        var term = request.term.replace(/ /g, "*\",\"*");
        var searchUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/search/query?querytext='and(\"*" + term + "*\",path:\"" + _spPageContextInfo.webAbsoluteUrl + "/Lists/Schools\")'&enablefql=true";
        var executor = new SP.RequestExecutor(_spPageContextInfo.webAbsoluteUrl);

        executor.executeAsync({
            url: searchUrl,
            method: "GET",
            headers: { "Accept": "application/json; odata=verbose" },
            success: function (data) {
                var jsonObject = JSON.parse(data.body);
                var results = jsonObject.d.query.PrimaryQueryResult.RelevantResults.Table.Rows.results;
                var clientContext = new SP.ClientContext();
                var schoolList = clientContext.get_web().get_lists().getByTitle('Schools');

                response($.map(results, function (result) {
                    school = schoolList.getItemById(result.Cells.results[6].Value.split('=').pop());
                    clientContext.load(school, 'Title', 'Adress', 'City');
                    clientContext.executeQueryAsync(Function.createDelegate(this, function (schoolName, schoolAdress, schoolCity) {
                        schoolName = school.get_item('Title');
                        schoolAdress = school.get_item('Adress');
                        schoolCity = school.get_item('City');
                    }), Function.createDelegate(this, function (sender, args) {
                        alert('Error occured: ' + args.get_message());
                    }));
                    return {
                        label: schoolName + " (" + schoolAdress + " " + /*schoolCity + */ ")",
                        value: schoolName
                    };
                }));
            }
        });
    }
});

當我測試此代碼時,由於異步函數executeQueryAsync ,schoolName,schoolAdress和schoolCity均未定義。
所以我認為解決方案在Promise或Callback中,但是我嘗試了一周的不同解決方案,但沒有成功:-
請注意,我仔細閱讀了這篇文章我如何從異步調用返回響應? ,但仍然找不到一個好的解決方案...
誰能幫我 ?
提前致謝,
弗洛朗

考慮到您必須將對象數組傳遞給響應回調函數,並且每個結果都調用異步函數clientContext.executeQueryAsync我們可以將每個對象轉換為一個Promise,然后將它們傳遞給Promise.all(),它將等待解決所有問題並退還給他們。 解決所有問題后,對象將位於schoolObjectArray內部,然后您可以將其傳遞給響應函數。 是應該工作的。

$(School_fieldID).autocomplete({
minLength: 2,
source: function (request, response) {
    var term = request.term.replace(/ /g, "*\",\"*");
    var searchUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/search/query?querytext='and(\"*" + term + "*\",path:\"" + _spPageContextInfo.webAbsoluteUrl + "/Lists/Schools\")'&enablefql=true";
    var executor = new SP.RequestExecutor(_spPageContextInfo.webAbsoluteUrl);

    executor.executeAsync({
        url: searchUrl,
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        success: function (data) {
            var jsonObject = JSON.parse(data.body);
            var results = jsonObject.d.query.PrimaryQueryResult.RelevantResults.Table.Rows.results;
            var clientContext = new SP.ClientContext();
            var schoolList = clientContext.get_web().get_lists().getByTitle('Schools');

            Promise.all($.map(results, function (result) {
                school = schoolList.getItemById(result.Cells.results[6].Value.split('=').pop());
                clientContext.load(school, 'Title', 'Adress', 'City');
                return new Promise(function(resolve,reject) {
                    clientContext.executeQueryAsync(Function.createDelegate(this, function (schoolName, schoolAdress, schoolCity) {
                    schoolName = school.get_item('Title');
                    schoolAdress = school.get_item('Adress');
                    schoolCity = school.get_item('City');
                    resolve({
                            label: schoolName + " (" + schoolAdress + " " + /*schoolCity + */ ")",
                            value: schoolName
                        });
                    }), Function.createDelegate(this, function (sender, args) {
                        reject('Error occured: ' + args.get_message());
                    }));
                })
            }))
            .then(function(schoolObjectArray){
                response(schoolObjectArray)
            })
            .catch(console.error);
            }
        });
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM