Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.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_Promise - Fatal编程技术网

Javascript 这两份承诺书是等价的吗?

Javascript 这两份承诺书是等价的吗?,javascript,promise,Javascript,Promise,从一本教程书中我看到了以下代码 createShoppingList: (store, shoppinglist) => { return api.addNewShoppingList(shoppinglist).then(() => { store.dispatch('populateShoppingLists') }, () => { store.commit(types.ADD_SHOPPING_LIST, shoppingli

从一本教程书中我看到了以下代码

  createShoppingList: (store, shoppinglist) => {
    return api.addNewShoppingList(shoppinglist).then(() => {
      store.dispatch('populateShoppingLists')
    }, () => {
      store.commit(types.ADD_SHOPPING_LIST, shoppinglist)
    })
  }
注意.then()块后面的逗号

它是否等效于链式.then()

或者它只是.then()中的一个块? 比如:

感谢您的反馈

.then(resolved, rejected)
不等于

.then(resolve)
.then(rejected)// :/
它相当类似于:

.then(resolved)    
.catch(rejected)
(仍然有一个区别,那就是当时的拒绝现在会被捕获,而上面的版本是未捕获的)

.then(resolved, rejected)
更像

.catch(rejected)
.then(resolved)
但并非完全如此,如
。然后(已解决,已拒绝)
此函数的结果将转发给以下承诺,而不会转发给彼此

var resolved=value=>`resolve(${value})`;
var rejected=err=>`catched(${err})`;
var throwing=()=>{throw“抛出错误”};
承诺.决心(42)
.然后(解决,拒绝)
.then(v=>console.log(“then(a,b)=>”,v));
承诺.拒绝(42)
.捕获(拒绝)
.然后(解决)
.then(v=>console.log(“catch(b).then(a)=>”,v));
//这就是为什么。那么(a,b)就不一样了。那么(a),抓住(b)
承诺.决心(42)
.然后(扔,拒绝)
.then(v=>console.log(“then(throw,b)=>”,v))
.catch(err=>console.log(“then(throw,b)=>”,err));
承诺.决心(42)
.然后(投掷)
.捕获(拒绝)
.then(v=>console.log(“then(throw.catch(b)=>”,v))
.catch(err=>console.log(“then(throw).catch(b)=>”,err))

。作为控制台包装{top:0;最大高度:100%!important}
否,逗号不在后面。然后()。。。它就在里面。。。到的第二个回调函数是在rejectionok上调用的,谢谢。。。因此,代码中似乎存在一个bug,因为在解析apI.addNewShoppingList时,应该同时执行store.commit和store.dispatch。。。在这本书里。提交然后发送..)也许,谁知道,没有完整的上下文是的,但是在图书上下文中,在添加shoppingList(将其保存到服务器:ShoppingListsResource.save(数据))之后然后必须将其提交到本地存储中,然后通过使用分派执行操作“PopulateShoppingList”来重新显示新列表……第三个代码段与第一个代码段完全相同,只是有几个不同的换行符。是的,它明显不同于第二个。不,它更像是
.catch(拒绝)。然后(解决)
,但不是完全。如果您的
resolved()
方法抛出另一个错误,您将注意到差异<代码>已拒绝
在此处无法捕获。@thomas不,这将始终进入then…:/但是如果
then()
抛出一个错误,那么
catch()
将捕获它,您将得到一个已解决的承诺。使用
时,
a()
中的(a,b)
错误将不会被捕获并得到拒绝的承诺。IMO
.catch(b)。然后(a)
更接近
。然后(a,b)
但这仍然不是一回事,因为这里您将把
catch()
块返回的值注入
then()
。最后,
then(a,b)
与条件相当,因为只有一侧将被执行,而使用
.catch(b)。然后(a)
或使用
。然后(a)。catch(b)
两侧都可以执行。查看我答案中的片段。@Jonasw@bergi我知道。这就是为什么仍然存在这样一个区别,即当时的拒绝现在会被捕获,而上层版本则未被捕获
.then(resolved, rejected)
.catch(rejected)
.then(resolved)