2016-02-20 136 views
0

我无法弄清楚如何从uniqueCheck()返回值到isValid。我在setTimeout中添加了模拟异步操作。异步函数后返回值

function isValid(data) { 

    uniqueCheck(data, function(val) { 
     return val; 
     //true 
    }); 
    // need the value here 
} 

function uniqueCheck(data, cb) { 

    // do something with data async 
    setTimeout(function() { 

     cb(true) 

    }, 1000); 

} 

console.log(isValid("some data")); 
+0

你不能。不可能。 – Bergi

回答

0

要在代码中使用异步调用,您可以使用返回结果Promises,或者例如,如果你使用jQuery,您可以利用的Deferred object.

//async function using $.Deferred 
function asyncFunction(){ 
    var dd = $.Deferred(); 
    setTimeout(function(data) { 
     dd.resolve('loaded'); 
    }, 500); 
    return dd.promise(); 
} 

//somwhere in your code 
asyncFunction().then(function(value){ 
    //do stuff when Deferred object is resolved 
    //value = 'loaded' 

}) 
在你的代码

function isValid(data) { 
    uniqueCheck(data).then(function(){ 
    //value is available here 

    }); 
    // but not here 
    //because this code is executed earlier then callback 
} 

function uniqueCheck(data, cb) { 
var dd = $.Deferred(); 
    // do something with data async 
    setTimeout(function() { 
     cb(true) 
    }, 1000); 
return dd.promise(); 
} 
+0

的Console Tab中运行它感谢你。我试图让我的头脑在没有承诺的情况下实现这个结果,只是回调(如果可能的话) – js2015

+0

带有回调或承诺 - 无论如何,在你有'需要价值'的地方是不可能有价值的。通过任何方法,你使用你的结果将在闭包内,更深的一层括号,可以这么说。如果你有几个这样的功能 - 发布者/订阅者模式 - https://davidwalsh.name/pubsub-javascript,还有一个选择,但它也增加了额外的级别 – shershen

0

你必须通过一个回调函数

function isValid(data, callback) { 

    uniqueCheck(data, function(val) { 
     callback(true); 
     return val; 

     //true 
    }); 
    // need the value here 
} 

function uniqueCheck(data, cb) { 

    // do something with data async 
    setTimeout(function() { 

     cb(true) 

    }, 1000); 

} 
//console.log(isValid("some data")); 
isValid("some data", function(value){ 
    console.log(value); 
}); 
+0

TypeError:回调不是函数 – js2015

+1

没有错误,回调函数是一个参数。 “function(value){ console.log(value); }” – thanhpk

+0

你试过运行上面的代码吗? – js2015