从承诺中得到回报.用javascript完成

returning something from a promise.done in javascript

本文关键字:javascript 完成 回报 承诺      更新时间:2023-09-26

我通常在任何异步类型调用的实际。done()函数中完成大部分需要的工作。但在这种情况下,我想返回字符串,因为我需要它在多个地方但这个函数一直返回未定义。该变量超出了异步调用的范围,因此应该可以返回否?

 var stringIWantBack = function getTableEditorFieldArray(pageName, tableId) {
     var searchString = 'webpagename[name ="' + pageName + '"] > tableid[id ="' + tableId + '"] > editor';
     var fieldArray;
     $.when(datatableUtility.GetInitStringXml())
         .done(function (returnedXml) {
             fieldArray = $(returnedXml).find(searchString).text();
             return fieldArray;
         })
         .fail(function (jqXhr, textStatus, errorThrown) {
             // alert("Error downloading projection data: " + textStatus + " Error: " + errorThrown);
             toastr.warning('Error downloading datatable editor fields array: ' + textStatus + ' Error: ' + errorThrown);
         });
 }

不能从AJAX(异步)函数返回任何东西。它在后台运行,回调会在将来某个时候被调用当它完成的时候。此时,函数已经返回并完成了。

你可以这样做:

function getTableEditorFieldArray(pageName, tableId) {
     var searchString = 'webpagename[name ="' + pageName + '"] > tableid[id ="' + tableId + '"] > editor';
     return $.when(datatableUtility.GetInitStringXml()).then(function (returnedXml) {
         return $(returnedXml).find(searchString).text();
     }).fail(function (jqXhr, textStatus, errorThrown) {
         // alert("Error downloading projection data: " + textStatus + " Error: " + errorThrown);
         toastr.warning('Error downloading datatable editor fields array: ' + textStatus + ' Error: ' + errorThrown);
     });
 }

在这里使用.then()而不是.done()将允许您操作数据。这里的return将被发送到稍后附加的任何.done()方法。

例如:

getTableEditorFieldArray('test', 123).done(function(stringIWantBack){
    // This will be the value returned from `.then()`
    console.log(stringIWantBack);
});

问题不在于范围。你完全正确,你可以从你的getTableEditorFieldArray()函数返回fieldArray

var fieldArray;
$.when(/* ... */ );
return fieldArray;

此时fieldArray的值是undefined$.when()代码甚至可能不存在,因为它将等待下一个tick(在这个调用堆栈之外)来做任何工作。

必须接受回调以异步返回值。请注意,您可以返回由$.when()返回的promise,并且多个代码位可以对其调用.done()。使用.done()设置的回调函数将按照定义的顺序调用。