2016-02-20 135 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