想象一下,我有一个简单的javascript函数:
function someFunction(integer)
{
data = integer + 1;
return data;
}
我需要从另一个函数内部调用它并使用返回的值:
function anotherFunction(integer)
{
int_plus_one = someFunction(integer);
//Do something with the returned data...
int_plus_two = int_plus_one + 1;
return int_plus_two;
}
如何确保仅在someFunction完成后返回anotherFunction返回的返回?它实际上似乎与这些非常快的功能一起正常工作。但是,如果someFunction必须执行一些ajax查找,则aotherFunction的返回将失败。
谢谢, 史蒂夫
答案 0 :(得分:3)
您不知道何时或甚至是否会完成异步功能。处理此问题的唯一方法是使用回调函数,该函数在异步操作完成后执行。
这是我的#啊;啊哈!"时刻:How to return the response from an asynchronous call?
答案 1 :(得分:0)
就您的代码同步而言,上述方法很好。
一旦开始引入异步部分,下面涉及回调的部分是一种常用的方法:
function fn (v, cb) {
doSomethingAsyncWithV(function (err, _v) {
if(err) return cb(err);
cb(null, _v);
})
}
function yourFirstFn () {
var v = 0;
fn(v, function (err, _v) {
// do here whatever you want with the asynchronously computed value
});
}
答案 2 :(得分:0)
承诺怎么样?考虑到这一点,没有必要担心回调。这是AngularJS中很酷的事情之一。
var q = require('q');
var myPromise =function() {
var deferred = q.defer();
setTimeout(function(){
var output = anotherFunction(1);
deferred.resolve(output)
}, 10000); // take times to compute!!!
return deferred.promise;
}
var objPromise = myPromise();
objPromise.then(function(outputVal){
console.log(outputVal) ; // your output value from anotherFunction
}).catch(function(reason) {
console.log('Error: ' + reason);
})
然后只有在承诺解决后才会执行。如果捕获到异常或错误,则执行catch函数。
答案 3 :(得分:0)
怎么样?
function someFunction(integer, callback)
{
data = integer + 1;
return callback(data);
}
function anotherFunction(integer)
{
int_plus_one = someFunction(integer, function(data){
int_plus_two = int_plus_one + 1;
return int_plus_two;
});
//Do something with the returned data...
}
答案 4 :(得分:0)
你可以使用承诺:
new Promise(function someFunction(resolve, reject) {
ajaxLib.get(url, options, function (data) {
resolve(data);
});
}).then(function anotherFunction(integer)
{
int_plus_one = integer;
//Do something with the returned data...
int_plus_two = int_plus_one + 1;
return int_plus_two;
});
如果你使用jQuery,$.ajax
会返回一个thenable:
$.ajax(url, options).then(function processDataFromXHR(data) {
return data.integer;
}).then(function anotherFunction(integer){
int_plus_one = integer;
//Do something with the returned data...
int_plus_two = int_plus_one + 1;
return int_plus_two;
});