簡體   English   中英

如何鏈接一個在Node JS中調用另一個Promise的Promise

[英]How to chain a promise that calls another promise in node js

我是node js的新手,我試圖創建一個rest方法來返回對象列表,在我想發送響應之前一切都還好,邏輯是這樣的:

  1. 尋找對象
  2. 初始化對象
  3. 將對象推入列表
  4. 發送帶有對象的列表

發生的事情是,點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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM