3

我正在调用一个在延迟中具有一些逻辑的方法,当该逻辑完成时,我想将值返回给被调用者。见下文:

//Callee.js
var myAssistant = new Assistant();
console.log(myAssistant.whatIsTheValue());



//Assistant.js
whatIsTheValue : function(someArg) {
   var deferred = someService.getSomething();
   deferred.then(lang.hitch(this, this._getTheValue));

   //In theory, I want to return whatever this._getTheValue returns, how can I do that?!
}

_getTheValue() {
   ...
   ...
   return xyz;
}
4

3 回答 3

2

延迟是异步操作。因此,您不能以正常方式从它们返回变量,因为它们要等到当前函数上下文完成后才会执行。

如果您想使用该值做更多事情,则需要根据另一个回调(IE 链接 then 语句)来执行此操作。)

延迟的目的是为回调提供顺序操作。因此,您可以将它们链接起来以实现您想要的结果。如果您需要在当前执行上下文中提供结果,您将不得不找到一种同步(而不是延迟)方法来执行您想要的操作。

所以像这样

//Assistant.js
whatIsTheValue : function(someArg) {
   var deferred = someService.getSomething();
   var next = deferred.then(lang.hitch(this, this._getTheValue));
   next.then(/*insert next function here*/);
}

您需要了解使用延迟的 lang.hitch 直到 whatistheValue 操作完成后才会执行。因此,您不必将值返回给任何名为 whatisthevalue 的函数,而是必须将处理该值的逻辑放入一个新函数中,并将其用作您的 deferred 的附加回调。这可能需要对您的程序进行一些重组。

于 2013-01-10T17:26:35.770 回答
1

我不知道你做了什么lang.hitch,但解决方案应该是这样的:

Assistant.prototype.whatIsTheValue = function(someArg) {
    var deferred = someService.getSomething();
    return deferred.then(lang.hitch(this, this._getTheValue));
//  ^^^^^^
};

var myAssistant = new Assistant();
myAssistant.whatIsTheValue().then(console.log); // use console.log.bind(console) in Chrome
//                           ^^^^ - it is a promise you return
于 2013-01-10T17:31:39.817 回答
1

改用 JQuery $when

例子

// assuming both getData and getLocation return their respective Promise
var combinedPromise = $.when(getData(), getLocation())

// function will be called when both getData and getLocation resolve
combinePromise.done(function(data,location){
  alert("We got data: " + dataResult + " and location: " + location);
}); 

http://www.html5rocks.com/en/tutorials/async/deferred/

于 2013-01-10T17:34:20.937 回答