gpt4 book ai didi

javascript - "Iterating"throw Promise 不允许生成不同的 id

转载 作者:行者123 更新时间:2023-12-03 06:52:33 25 4
gpt4 key购买 nike

阅读some amazing tutorials关于 promise ,我发现,如果我需要交互抛出一些 promise ,我不能使用 forEach 或其他一些“传统”迭代机制,我必须使用 Q 库作为 Node ,我必须“使用 Q.all 进行迭代”。

我在 Nodejs Express 中编写了一个简单的示例,以确保我已经理解了 Promise:

var form = [
{'name':'FORM_NAME_1.1',
'label2':'FORM_LABEL_1.2'
},
{'name':'FORM_NAME_2.1',
'label2':'FORM_LABEL_2.2'
}
];
var params = ['params1','params2'];
var meta = ['meta1','meta2'];

app.get('/', (req,res) => {
return Q.all([
form.map((currentValue,index,arr) => {
req.id = Math.random(); //Random ID to be used in the next promises
console.log(currentValue);
return Form.insert(currentValue,req);
}),
params.map((currentValue,index,arr) => {
console.log(req.id);
return Field.insert(currentValue,req.id);
}),
meta.map((currentValue,index,arr) => {
console.log(req.id);
return Meta.insert(currentValue,req.id);
})
])
.catch((err) => next(err))
.done(() => console.log('It\'s done'));
});

Form.insert 代码只是一个带有 console.log 调用的 promise ,对于 Field.insertMeta 也是如此.插入

var Form = {
insert: (param1,req) => {
var deferred = Q.defer();
console.log('Goes throw Form');
deferred.resolve();
return deferred.promise;
}
}

问题是,似乎迭代正确,但动态生成的 id 没有按照 promise 改变,这是控制台输出:

Listening at port 3000...
{ name: 'FORM_NAME_1.1', label2: 'FORM_LABEL_1.2' }
Goes throw Form
{ name: 'FORM_NAME_2.1', label2: 'FORM_LABEL_2.2' }
Goes throw Form
0.3757301066790548
Goes throw Field
0.3757301066790548
Goes throw Field
0.3757301066790548
Goes throw Meta
0.3757301066790548
Goes throw Meta
It's done

关于出了什么问题有什么想法吗?谢谢!!

最佳答案

它不起作用的原因是因为在第一个 for 循环中,在其他 Promise 启动之前多次设置 req.id 并且所有这些 Promise 最终都使用最后一个随机生成的值,将您的代码更改为:

app.get('/', (req,res) => {

let process = (currentValue,index,arr) => {
let reqCopy = {id: Math.random()}
for(let attr in req) // copy all the request attributes
if(attr && attr!='id')
reqCopy[attr] = req[attr]
return Q.all([
Form.insert(form[index],reqCopy),
Field.insert(params[index],reqCopy),
Meta.insert(meta[index],reqCopy)
])
}
return Q.all(form.map(process))
.catch(next)
.done(() => console.log('It\'s done'));
})

您会注意到,我正在复制 req 的所有属性来克隆 reqCopy,因为我不确定需要 req 的哪些属性通过后续方法,但同时,由于代码的异步性质,单个 req.id 将无法工作

关于javascript - "Iterating"throw Promise 不允许生成不同的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37432906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com