2015-10-04 63 views
2

有下面的代碼:Node.js的promisses鏈

router.put('/:id', function(req, res) { 
    models.Task.find(req.params.id).then(function(task) { 
    task.updateAttributes({ 
     title: req.body.title, 
     description: req.body.description 
    }).then(function(task) { 
     res.json(task); 
    }) 
    }); 
}); 

我試圖重新因子驗證碼方式如下:

router.put('/:id', function(req, res) { 
    models.Task.find(req.params.id).then(function(task) { 
    task.updateAttributes({ 
     title: req.body.title, 
     description: req.body.description 
    }) 
    }).then(function(task) { 
    res.json(task); 
    }); 
}); 

在我能看到正確的JSON第一案輸出,但在第二個我可以看到空輸出。爲什麼?

回答

4

你不等待updateAttributes到了完成。你可以這樣做,但是,只需添加一個return

router.put('/:id', function(req, res) { 
    models.Task.find(req.params.id).then(function(task) { 
    return task.updateAttributes({ 
// ^^^^^^ 
     title: req.body.title, 
     description: req.body.description 
    }); 
    }).then(function(task) { 
    res.json(task); 
    }); 
}); 

當您返回從鏈的早期處理一個承諾,後續處理等它(並獲得其分辨率值)。


邊注:請記住,處理故障中的承諾,也通過使用第二個參數then和/或使用catch

+0

請告訴我,如何檢查任務是否爲空以更新屬性?謝謝! – malcoauri

+0

@malcoauri:* *任務可以'空'嗎? (我並不熟悉這個lib,但我希望能夠拒絕這個promise,而不是用'null'解決它。)如果是這樣,一個簡單的'if(task == null)'就足夠了。在這種情況下,您可能會'返回任務'而不是從'task.updateAttributes'返回承諾。隨後的'then'處理程序將立即得到'null'。 –

2

您需要返回第二個承諾:

router.put('/:id', function(req, res) { 
    models.Task.find(req.params.id).then(function(task) { 
    return task.updateAttributes({ 
     title: req.body.title, 
     description: req.body.description 
    }); 
    }).then(function(task) { 
    res.json(task); 
    }); 
});