2016-03-02 39 views
0

我想在一個承諾鏈中做兩個單獨的數據庫調用,但爲了測試目的,第一個調用被一個傳遞的簡單字符串替換。如何在節點快遞路由器中將「變量」傳遞給承諾鏈?

我的問題是,我無法訪問變量msg在我的第二個承諾(其中我嘗試設置context.foo =味精。

router.route("/") 
.get(function(request, response) { 

    var session = request.session; 

    return new Promise(function(resolve, reject) { 

     resolve("h!"); 

    }).then(function(msg){ 

     return new Promise(function(resolve, reject) { 

      Snippet.find({}, function(error, data) { 
       let context = { 
        snippets: data.map(function(snippet) { 
         return { 
          name: snippet.name, 
          snippet: snippet.snippet, 
          createdAt: snippet.createdAt, 
          user: snippet.user, 
          id: snippet._id 
         }; 
        }), 
        foo: msg 
       }; 
       resolve(context); 
      }); 
     }); 

    }).then(function(context){ 
     response.render("start/index", context); 
    }).catch(function(err){ 
     response.end(err); 
    }); 
}); 

的另一種嘗試,在這裏試圖路由器綁定諾...

router.route("/") 
.get(function(request, response) { 

    var session = request.session; 

    return new Promise(function(resolve, reject) { 

     resolve("hi!"); 

    }).then(function(msg){ 

     router.msg = msg; 

     return new Promise(function(resolve, reject) { 

      Snippet.find({}, function(error, data) { 
       let context = { 
        snippets: data.map(function(snippet) { 
         return { 
          name: snippet.name, 
          snippet: snippet.snippet, 
          createdAt: snippet.createdAt, 
          user: snippet.user, 
          id: snippet._id 
         }; 
        }), 
        foo: this.msg 
       }; 
       resolve(context); 
      }.bind(router)); 
     }); 

第三嘗試...

router.route("/") 
.get(function(request, response) { 

    var session = request.session; 

    return new Promise(function(resolve, reject) { 

     context.msg = "hi!"; 

     resolve(context); 

    }).then(function(context){ 

     return new Promise(function(resolve, reject) { 
      Snippet.find({}, function(error, data) { 
       context.snippets = { 
        snippets: data.map(function(snippet) { 
         return { 
          name: snippet.name, 
          snippet: snippet.snippet, 
          createdAt: snippet.createdAt, 
          user: snippet.user, 
          id: snippet._id 
         }; 
        }), 
       }; 
       resolve(context); 
      }); 
     }); 

    }).then(function(context){ 
     response.render("start/index", context); 
    }).catch(function(err){ 
     response.end(err); 
    }); 
}); 

所以基本問題始終是,我怎麼能「注入」,或使用無極範圍內可變的,當我有沒有周圍的物體,沒有「這個」來了attaach爲=)

+2

一碼片段看起來不錯,它應該工作。您可以嘗試使用'console.log'來跟蹤'msg'來了解發生了什麼。你可以看看簡化你的代碼的jsfiddle版本:https://jsfiddle.net/pogLza0q/ –

+0

你需要在Snippet.find()回調函數中使用'if(error)reject(error);'。此時的錯誤可能是也可能不是問題,但「reject()」應該在那裏。 –

+0

我會在這裏和[bluebird coroutine](http://bluebirdjs.com/docs/api/promise.coroutine.html)一起去。它會讓你的生活變得更簡單。 –

回答

1

使用藍鳥強大Promise.coroutine()

router.route("/") 
.get(Promise.coroutine(function*(request, response) { 
    try { 
     const dbResult1 = yield getValueFromDatabaseAsync(/* w/e */); 
     const dbResult2 = yield getValueFromDatabaseAsync(/* w/e, can be dbResult1 */); 

     const context = {...}; // use dbResult1 and dbResult2 here normally 
     response.render("start/index", context); 
    } catch (err) { 
     response.end(err); 
    } 
}));