我是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);
}
});
}
)
};
答案 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(...)...
答案 1 :(得分:1)
我已经模拟了测试以使承诺链工作。看看它是否对你有帮助。
在图1.1中,这是测试结果,第一个结果是在await
的调用中未使用command1.init()
,第二个结果是await
// 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即可。
但是,如果由于测试中的断言错误而导致拒绝承诺(在catch
调用的plan
块中如此 - assert.equal("Error pln",error)
)
然后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);
}
// });
}
)
};