我正在调用一个在延迟中有一些逻辑的方法,当该逻辑完成时,我想将值返回给被调用者。见下文:
//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;
}
答案 0 :(得分:1)
延迟是异步操作。因此,您无法以正常方式从它们返回变量,因为它们将在当前函数上下文完成之后才会执行。
如果你想用这个值做更多的事情,你需要在另一个回调(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的任何函数,而是必须将处理该值的逻辑放入新函数中,并将其用作延迟函数的附加回调函数。这可能需要对您的计划进行一些重组。
答案 1 :(得分: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
答案 2 :(得分: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);
});