如何返回值然后捕获块

时间:2019-05-20 11:56:57

标签: node.js es6-promise

下面的我的代码;

我有一个然后赶上的块。我的responseArray是一个全局变量。我收到来自functionName函数的响应;但我不能使用结果然后阻止。我该如何使用然后响应超出限制?

下面的我的代码;

我有一个然后赶上的块。我的responseArray是一个全局变量。我收到来自functionName函数的响应;但我不能使用结果然后阻止。我该如何使用然后响应超出限制?

config.action_mailer.raise_delivery_errors = false
config.action_mailer.default_url_options = { host: "https://myapp.com" }
config.action_mailer.asset_host = "https://myapp.com"
config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  :address        => 'myval',
  :port           => '587',
  :authentication => :plain,
  :user_name      => 'myval',
  :password       => Rails.application.credentials.mailgun_smtp_pass,
  :enable_starttls_auto => true
}

1 个答案:

答案 0 :(得分:0)

首先要记住的是,承诺是异步。承诺完全按照他们所说的做,实际上是在签定一个合同(承诺),您将获得数据(或错误),但不会同步,但要在将来某个时间完成计算。

要访问您的responseArray,您需要解决foo2承诺(在.then内部),并通过调用它来继续承诺链,即

module.exports = {
 foo1: function(param){
   return new Promise((resolve,reject) => {
      var result = //some code here
      resolve(result);
   });
 },
 foo2: function(param){
   return new Promise((resolve,reject) => {
      this.foo1('abc').then(function(res){
        let response = {
            'item':'ok',
            'result':res.some_field
        };
        console.log(response);  // its ok here. 
        responseArray.push(response); //its ok here too
        resolve(responseArray) // resolve the promise inside of .then
    }).catch(err =>{
        console.log(err);
        reject(err);
    });
   });
 }
};

foo2('someValue').then(response => {
  console.log(response) // this will be your array
})

此外,请注意,请确保您没有陷入promise构造函数反模式的陷阱。在这里,只是为了使用“ promises

,就不必要将同步代码转换为异步代码

例如,对promise的有效使用将是转换一个回调,如下所示:

const getFile = filename => {
  return new Promise((resolve, reject) => {
    fs.readFile(filename, 'utf8', (err, data) => {
      if (err) reject(err)
      resolve(data)
    })
  })
} 

这是不必要的:

const printData = data => {
  return new Promise((resolve, reject) => {
    resolve(console.log(data))
  })
} 

vs

const printData = data => {
  console.log(data)
}

在此处了解更多信息:What is the explicit promise construction antipattern and how do I avoid it?