如何使用node.js中的promises一个接一个地执行四个命令

时间:2018-03-28 00:46:32

标签: node.js promise

我是node.js的新手,我不确定为什么我的承诺不符合预期。

var command1 = sshCommands.init().catch( (error) => {console.log(error);});
    var command2 = command1.then(sshCommands.plan(filename, size, ipaddr)).catch( (error) => {console.log(error);});
    var command3 = command2.then(sshCommands.apply(filename, size, ipaddr)).catch( (error) => {console.log(error);});
    var command4 = command3.then(strap(filename, ipaddr)).catch( (error) => {console.log(error);});

以下是我想要一个接一个地触发的功能。目前所有都是同时启动的。使用给定的代码

module.exports.init  = () => {
    return new Promise((resolve, reject) => {
        session.execute('ls /opt/myFiles', function (err, code, logs) {
            if (err) {
                console.log(err);
                reject(err);
            } else {
                resolve(code);
            }
        });
    }
)
};

module.exports.plan = (filename, size, ipaddr) => {
    return new Promise((resolve, reject) => {
        session.execute('ls /opt/files', function (err, code, logs) {
            if (err) {
                console.log(err);
                reject(err);
            } else {
                resolve(code);
            }
        });
    }
)
};

module.exports.apply = (filename, size, ipaddr) => {
    return new Promise((resolve, reject) => {
        session.execute('ls /opt/files2', function (err, code, logs) {
            if (err) {
                console.log(err);
                reject(err);
            } else {
                resolve(code);
            }
        });
    }
)
};

3 个答案:

答案 0 :(得分:1)

我认为你错过了Node中的承诺点。承诺的意义在于,当一个人抛出一个错误时,它们的整个集合都是无效的。因此,如果你有[promise1,promise2,promise3]和promise2抛出错误,promise3将自动不被执行。对于NodeJS,建议添加一个类似bluebird的库。

无论哪种方式,您的代码都应该这样完成。

sshCommands.init()
.then(sshCommands.plan(filename, size, ipaddr))
.then(shhCommands.apply(filename, size, ipaddy))
.then(strap(filename. ipaddr))
.catch((err) => {...});

您还可以对履行中返回的内容进行一些评估。

shhCommands.init((e) => {
    console.log(e);
    return shhCommands.plan(filename, size, ipaddr);
}).then(...)...

关于蓝鸟承诺here的更多一般承诺here或更多。

答案 1 :(得分:1)

我已经模拟了测试以使承诺链工作。看看它是否对你有帮助。

在图1.1中,这是测试结果,第一个结果是在await的调用中未使用command1.init(),第二个结果是await

图1.1 enter image description here

// mochatest

    const command1=require('./init'),command2=require('./plan'), command3=require('./apply');
    describe("asyncTests", () => {
    it("handles Promise rejection",async ()=>{
        var filename, size, ipaddr
        await command1.init().then(function()
            {
                command2.plan(filename, size, ipaddr).then(function(){
                   command3.apply(filename, size, ipaddr); 
                })
                }).catch(function (error){
                    console.log("Error "+error)
                })
    })       
    });

// init.js

module.exports.init  = () => {
    return new Promise((resolve, reject,next) => {
        //session.execute('ls /opt/myFiles', function (err, code, logs) {
        var v=false;
            if (v===true) {
                console.log("init"+v);
                throw new Error("init")
                //reject(v);
                next;
            } else {
                console.log("init"+v);
                resolve(v);
            }
        //});
    }
)
};

// plan.js

module.exports.plan = (filename, size, ipaddr) => {
    return new Promise((resolve, reject,next) => {
       // session.execute('ls /opt/files', function (err, code, logs) {
       var v=false;
            if (v===true) {
                console.log("plan"+v);
                throw new Error("plan")
               // reject(v);
               next;
            } else {
                console.log("plan"+v);
                resolve(v);
            }
       // });
    }
)
};

// apply.js
module.exports.apply = (filename, size, ipaddr) => {
    return new Promise((resolve, reject) => {
       // session.execute('ls /opt/files2', function (err, code, logs) {
       var v=false
            if (v===true) {
                console.log("apply"+v);
                throw new Error("apply")
                reject(v);
            } else {
                console.log("apply"+v);
                resolve(v);
            }
       // });
    }
)
};

答案 2 :(得分:0)

@Vladyslav Kochetkov - 即使promise2引发错误,也可以执行promise3。看看这个例子。只需将.then链接到承诺拒绝承诺2即可。

enter image description here

但是,如果由于测试中的断言错误而导致拒绝承诺(在catch调用的plan块中如此 - assert.equal("Error pln",error)

enter image description here

然后promise3将不会被调用。

// mochatest
    const assert=require('chai').assert
    const asyncpromise=require('./asyncpromiserejection.js')
    const command1=require('./init'),command2=require('./plan'), command3=require('./apply');
    describe("asyncTests", () => {
    it("handles Promise rejection",async ()=>{
        var filename, size, ipaddr
        await command1.init().then(function()
            {
                command2.plan(filename, size, ipaddr).then(function(){
                   command3.apply(filename, size, ipaddr); 
                }).catch(function (error){
                    console.log("Error "+error)
                }).then(function(){
                   command3.apply(filename, size, ipaddr); 
                })
                }).catch(function (error){
                    console.log("Error "+error)
                })
    })    
    });

// init.js

module.exports.init  = () => {
    return new Promise((resolve, reject,next) => {
        //session.execute('ls /opt/myFiles', function (err, code, logs) {
        var v=false;
            if (v===true) {
                console.log("init"+v);
                throw new Error("init")
                //reject(v);
                next;
            } else {
                console.log("init"+v);
                resolve(v);
            }
        //});
    }
)
};

// plan.js
module.exports.plan = (filename, size, ipaddr) => {
    return new Promise((resolve, reject,next) => {
       // session.execute('ls /opt/files', function (err, code, logs) {
       var v=true;
            if (v===true) {
                console.log("plan"+v);
                throw new Error("plan")
               // reject(v);
              // next;
            } else {
                console.log("plan"+v);
                resolve(v);
            }
       // });
    }
)
};

// apply.js
module.exports.apply = (filename, size, ipaddr) => {
    return new Promise((resolve, reject) => {
       // session.execute('ls /opt/files2', function (err, code, logs) {
       var v=false
            if (v===true) {
                console.log("apply"+v);
                throw new Error("apply")
                reject(v);
            } else {
                console.log("apply"+v);
                resolve(v);
            }
       // });
    }
)
};