簡體   English   中英

等待異步函數完成而不添加回調

[英]Wait for asynchronous function to finish without adding callback

我正在使用Mocha和Should.js為我的Node.js / Express / Mongoose項目編寫測試,我正在測試訪問MongoDB的函數。 我希望這些測試完全獨立於我的數據庫中的實際記錄,所以我想創建一個條目然后加載它,並對它進行所有測試,然后刪除它。 我編寫了我的實際函數(我在整個項目完成后編寫測試),這樣create函數沒有回調函數; 它只是在完成后呈現頁面。 在我的測試腳本中,我在調用create之后調用了load_entry函數,但有時create需要比平時更長的時間,因此load_entry在實際無法加載文章時會拋出錯誤,因為它尚未創建。 有沒有辦法確保在不使用回調的情況下完成異步函數?

如果我能提供更多信息,請告訴我。 我看了整個谷歌,找不到任何真正回答我問題的東西,因為大多數解決方案只是說“使用回調!”

使用所謂的promise

你可以在這里閱讀更多相關信息。

有很多很棒的庫可以幫到你。

Q.js是我個人喜歡的,現在它被廣泛使用。 許多其他人也存在jQuery中的承諾。

以下是使用異步json-p調用的aq promise的示例: DEMO

var time;
$.ajax({
    dataType: 'jsonp',
    type: 'GET',
    url: "http://www.timeapi.org/utc/now.json",
    success: function (data) {
        time = data;
    },
    error: function (data) {
        console.log("failed");
    }
})
.then(function(){ // use a promise library to make sure we synchronize off the jsonp
    console.log(time);    
});

這絕對是你想要回調的東西。 除此之外,您將不得不編寫某種回調包裝器來輪詢數據庫以確定何時完成創建相關記錄,然后發出事件或執行其他異步操作以允許測試繼續。

由於執行異步操作的唯一本機方式是: setTimeoutsetIntervaladdEventListener ,並且它們都進行回調,最終必須在某處使用回調。

但是,您可以使用Promises / A(也稱為Deferreds)隱藏它。

您的代碼可能如下所示:

db.create_entry("foo", data).done(function (entry) {
    db.delete_entry(entry).done(function () {
        console.log("entry is deleted");
    });
});

使用then-chaining:

db.create_entry("foo", data).then(function (entry) {
    return db.delete_entry(entry);
}).done(function () {
    console.log("entry is deleted");
});;

我找到了一個有效的解決方案。 我所做的是為我的函數添加一個回調( next ),並且只有在指定它時才調用它(即,對於測試):

//more stuff above
article.save(function(err){
    if (!err) {
        console.log(req.user.username + ' wrote ' + article.slug)
        return next() || res.redirect('/admin')
    }
    return next(err) || res.render('articles/entry_form', {
        title: 'New Entry',
        article: article,
    })
})

這樣,當我運行實際的服務器並且沒有指定回調時,它不會拋出錯誤,因為它只會返回res.render語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM