Я использую Node.js и Q для написания асинхронного кода на стороне сервера. Я новичок в обещаниях (и я новичок в асинхронном программировании в целом), и у меня возникают проблемы, которые я не смог решить, глядя на Q-документацию. Вот мой код (это CoffeeScript - дайте мне знать, если вы хотите, чтобы увидеть JavaScript, а):Javascript и обещания с проблемами Q-закрытия в обещаниях
templates = {}
promises = []
for type in ['html', 'text']
promises.push Q.nfcall(fs.readFile
, "./email_templates/#{type}.ejs"
, 'utf8'
).then (data)->
# the problem is right here - by the time
# this function is called, we are done
# iterating through the loop, and the value
# of type is incorrect
templates[type] = data
Q.all(promises).then(()->
console.log 'sending email...'
# send an e-mail here...
).done()->
# etc
Надеюсь, мои комментарии объяснил проблему. Я хочу выполнить итерацию по списку типов, а затем выполнить цепочку обещаний для каждого типа, но проблема в том, что значение type
меняется за пределы объема обещаний. Я понимаю, что для такого краткого списка я могу просто развернуть цикл, но это не является устойчивым решением. Как я могу гарантировать, что каждое обещание видит другое, но локально правильное значение type
?
Спасибо. Хотя я не копировал это решение точно, объяснение в этом сообщении в блоге помогло мне создать исправление. – jayhendren