2016-03-02 117 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); 
    } 
})); 
相关问题