Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 沿着承诺链传递价值观_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 沿着承诺链传递价值观

Javascript 沿着承诺链传递价值观,javascript,node.js,promise,Javascript,Node.js,Promise,所以,我对异步非常陌生,我无法理解它是如何工作的,因为我可以理解它,但当我执行它时,似乎我没有 所以,我有一个代码,我试图连续运行承诺,并携带变量,如果它遇到错误,它将被捕获 下面是我正在尝试的简单代码: var x = new Promise(function(resolve, reject) { var one = 1 resolve(one) // if error happens go to catch }) .then(function(value) { var two

所以,我对异步非常陌生,我无法理解它是如何工作的,因为我可以理解它,但当我执行它时,似乎我没有

所以,我有一个代码,我试图连续运行承诺,并携带变量,如果它遇到错误,它将被捕获

下面是我正在尝试的简单代码:

var x = new Promise(function(resolve, reject) {
var one = 1
    resolve(one)
    // if error happens go to catch
})
.then(function(value) {
var two = 2;
    resolve(two);
    // if error happens go to catch
})
.then(function(value) {
var three = 3;
    resolve(three);
    // if error happens go to catch
})
.then(function(value) {
console.log(one + two + three);
})
.catch(function(value) {
    // reverse all the execution
})

x;
我正在创造一个承诺

第一个承诺,用于循环包含要插入的某些对象

第二个承诺将在我的第一个表中插入一些行

第三个承诺将插入第一个表中的一些行和第二个承诺中的一些结果

第四个承诺会完成一些事情,等等

以及一个捕获,它将删除由错误插入和剪切的数据

这就是我试图想象的逻辑、代码和执行

顺便说一句,我正在使用mysql。对于能够帮助我的人,请,我需要你。谢谢

如果您对我正在转换的真实代码感到好奇,这就是我目前所做的:


我在这里使用了一些just promise,我想如果我使用promise链接,我可以缩短或清理我的代码。

在回调中,你把它放在“then”中,你不需要调用resolve()来调用链的下一步。您只需要返回一些值,链的下一步将接收它作为参数

您可能混淆了承诺的创建和链接方式。创建承诺时,向其构造函数提供回调,其参数为“resolve”和“reject”,它们也是回调。它们预期将由promise构造函数中回调内的代码调用。调用resolve时,承诺将使用您提供的值进行解析。拒绝也一样


这个话题确实令人困惑,我建议您仔细看看人们是如何连锁承诺的,以及人们是如何创建自定义承诺的

下面介绍如何通过创建累加器对象向下传递值,然后在每个步骤中添加result属性,从而将值向下传递承诺链:

//承诺
var one=新承诺((解决、拒绝)=>{
决议(1)
})
风险值二=新承诺((解决、拒绝)=>{
决议(2)
})
风险值三=新承诺((解决、拒绝)=>{
决议(3)
})
//承诺链
一个。然后(一=>{
返回({one})
})
。然后(acc=>{
返回2。然后(2=>({…acc,2}))
})
。然后(acc=>{
返回三。然后(三=>({…acc,三}))
})
。然后(结果=>{
console.log(结果)
})
.catch(错误=>{
console.error(“一个、两个或三个失败”,err)

})
请您向我们展示您的真实代码或真实问题,而不是这些虚构的代码。然后,我们可以向您展示解决实际问题的正确方法。这个虚构的代码没有任何意义,因为只有对
resolve()
的第一次调用在参数
resolve
的范围内,所以其他调用都不起作用。这只是一个猜测(因为代码没有意义),但您可能想做的是在任何
抛出一些错误
。然后()
处理程序将其转到结尾处的
.catch()
。顺便说一句,如果您想向下一个承诺返回值,只需使用
return
,而不是
resolve
。好的,你希望这样。这里:LMAO Thankssss这是否意味着我需要先创建承诺,然后才能链接它们?Sorry@CherylBlossom您的DB方法是否返回承诺?您使用哪个节点模块与数据库通信?如果他们已经在兑现承诺,那么你只需要把他们拴起来。如果他们使用回调,那么你需要用承诺来包装它们。我只使用mysqljs,我需要一些最后插入的键和循环中类似对象的数组。这是到目前为止我的代码。这太混乱了,我所做的承诺基本上是我写的,但我不明白我是怎么做的,为什么这么做的。很抱歉,非常感谢。是的,它似乎不支持承诺,所以如果您想使用承诺,您必须将每个
db.query
包装在承诺中。哦,我明白了。你们有并没有推荐任何类似php的mysql节点模块来进行数据库通信,或者我下次可以使用的更简单的方法?但是说真的,非常感谢你,很抱歉让人讨厌。