[英]How to chain a promise that calls another promise in node js
我是node js的新手,我試圖創建一個rest方法來返回對象列表,在我想發送響應之前一切都還好,邏輯是這樣的:
發生的事情是,點3發生在點4之后,並且我得到了一個空列表。經過研究后,我發現由於節點的異步特性,我嘗試使用promise重寫代碼,但找不到示例一個承諾,另一個承諾
第一版
app.get('/initDevices', (req, res) => {
console.log('init devices.');
cameras = [];
onvif.startProbe().then((device_info_list) => {
let requests = device_info_list.map((info) => {
processDevice(info)
});
Promise.all(requests).then(() => {
console.log('all done ');
res.json(cameras);
});
}).catch((error) => {
res.json('nothing');
});
});
function processDevice(info) {
return new Promise((resolve, reject) => {
console.log("step 1");
let device = new onvif.OnvifDevice();
console.log("step 2");
device.init().then((devinfo) => {
console.log("step 3");
cameras.push(devinfo);
console.log("cameras: " + cameras.length);
resolve("done");
}).catch((error) => {
reject("It broke");
});
});
}
產量
init devices.
step 1
step 2
//response goes to the user with empty array []
step 3 //push happens
第二次嘗試(承諾)
function processDevice(info) {
return new Promise((resolve) => {
console.log("step 1");
let device = new onvif.OnvifDevice();
console.log("step 2");
resolve(device);
}).then((device) => {
console.log("step 3");
return device.init();
}).then((device) => {
console.log("step 4");
return cameras.push(device);
});
}
產量
init devices.
step 1
step 2
step 3
//response goes to the user with empty array []
step 4 //push happens
我認為這行返回device.init(); 兌現了諾言,但我不知道為什么。
有人可以幫助我了解為什么鏈條無法按預期工作嗎? 我做錯了什么?
順便說一下,我遵循的示例在這里,但是操作只是一些添加,不會調用其他promise
編輯:我找到了一種更好的方法來實現這一目標
function processDevice(info) {
let device = new onvif.OnvifDevice();
return device.init().then(() => {
console.log("init done");
cameras.push(camObj);
});
}
由於一個承諾已經被使用,所以沒有必要將它包裹在另一個
您的requests
變量未定義-您必須像這樣在地圖內部返回processDevice(info)
:
let requests = device_info_list.map((info) => {
return processDevice(info)
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.