下面的我的代码;
我有一个然后赶上的块。我的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
}
答案 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?