在javascript中从promise.done返回一些东西

时间:2014-05-14 17:38:51

标签: javascript promise

我通常会执行任何异步类型调用的实际.done()函数中所需的大部分内容。但在这种情况下,我想返回字符串,因为我需要多个位置,但此函数始终返回undefined。该变量超出了异步调用的范围,因此应该可以返回no?

 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);
         });
 }

2 个答案:

答案 0 :(得分:0)

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

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

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

您必须接受回调才能异步返回值。请注意,您可以返回$.when()返回的承诺,并且多位代码可以在其上调用.done()。使用.done()设置的回调将按照定义它们的顺序调用。

答案 1 :(得分:0)

您无法从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);
});