2013-07-04 58 views
0

我想獲取返回值,但始終得到未定義。從函數調用未定義的返回值Javascritpt

 var hasNext; 
     es.search(nextQuery, function (err, data) { 
      if(data.hits.hits.length) { 
       return hasNext = true; 
      } 
      return hasNext = false; 
     }); 

我不知道如何得到任何返回值並在其他地方使用它?我需要使用這個返回值來驗證其他函數,但它似乎在範圍之內。

這是我的代碼:

functions.getRecentPost = function (req, res, next) { 
    ......... 
    // This will get all the post 
es.search(query, function (err, data) { 
    if(err) { // if error means no post and redirect them to create one 
     return res.redirect('/new/post'); 
    } 

       .... 
    content.hasPrevious = hasPreviousPage(_page, content.posts.length); // this function is okay 

    hasNextPage(_page, content.posts.length, function (data) { 

      content.hasNext = data; 

     }); 
     res.render("index.html", content); 
}); 
}; 



function hasNextPage (pageNum, totalPost, callback) { 

    es.search(query, function (err, data) { 
     if(data.hits.hits.length) { 
     return callback(true); 
     } 
     return callback(false); 
    }); 
}; 
+2

那是因爲'es.search'是一個異步函數,所以它後面的所有內容都會在調用後立即執行,而不是在它返回時執行。任何依賴於es.search結果的邏輯都應該在設置hasNext的回調函數中進行。 –

+0

@ go-oleg有無論如何,我可以定義爲一個全局值或我至少可以將它返回給另一個函數? – Ali

+0

如果這段代碼片段屬於某個函數,那麼該函數本身也應該是異步的,並且應該將回調函數作爲一個參數,當它完成時調用它,類似於es.search'的工作方式。 –

回答

1

移動以下行:

res.render("index.html", content); 

hasNextPage回調:

functions.getRecentPost = function (req, res, next) { 

    //......... 

    es.search(query, function (err, data) { 

    //......... 

    hasNextPage(_page, content.posts.length, function (data) { 

     content.hasNext = data; 
     res.render("index.html", content); 

    }); 
    }); 
}; 

如果你希望getRecentPost返回的東西,那麼你需要給它添加一個回調,以便你可以使用它的返回值。例如,如果您希望這樣做:

functions.getRecentPost = function (req, res, next) { 

    //...... 

    return content; 
} 

doSomething(functions.getRecentPost(x,y,z)); 

它不起作用,因爲內容的最終值將異步檢索。相反,您需要這樣做:

functions.getRecentPost = function (req, res, next, callback) { 

    //......... 

    hasNextPage(_page, content.posts.length, function (data) { 

    content.hasNext = data; 
    res.render("index.html", content); 

    callback(content); 

    }); 
}; 

functions.getRecentPost(x,y,z,function(content){ 
    doSomething(content); 
}) 

您不能異步返回數據。你需要從寫作的東西改變你的代碼(和你的想法)是這樣的:

asyncFunction(function(data){ 
    foo = data; 
}); 

doSomething(foo); 

成這樣:

asyncFunction(function(data){ 
    doSomething(data); 
}); 

基本上,將所有你想要的異步函數之後運行的代碼放入您傳入的回調函數中。

定期勢在必行代碼如下所示:

function fN() { 
    x = fA(); 
    y = fB(x); 
    z = fC(y); 
    return fD(fE(z)); 
} 

異步代碼如下所示:

function fN (callback) { 
    fA(function(x){ 
    fB(x,function(y){ 
     fC(y,function(z){ 
     fE(z,function(zz){ 
      fD(zz,function(zzz){ 
      callback(zzz); 
      }); 
     }); 
     }); 
    }); 
    }); 
} 

請注意,你不回,你在回調票代替。

+0

真棒!謝謝 :) – Ali