【问题标题】:How to properly apply Function.apply.bind to Promise's resolution handler then()?如何正确地将 Function.apply.bind 应用于 Promise 的解析处理程序 then()?
【发布时间】:2015-11-03 06:31:21
【问题描述】:

编辑:这种方法纯粹是出于好奇。不是一个可行的解决方案,我也不会在其他地方使用。只是想了解这个特殊案例是如何运作的。

从这篇文章: https://github.com/getify/You-Dont-Know-JS/blob/master/async%20%26%20performance/ch3.md 这个假设可以工作:

function spread(fn) {
    return Function.apply.bind( fn, null );
}

Promise.all(
    foo( 10, 20 )
)
.then(
    spread( function(x,y){
        console.log( x, y );    // 200 599
    } )
)

foo() 是一个返回两个 Promise 数组的函数。 这是我的示例,它不起作用

var p1 = new Promise(function(resolve, reject) {
    resolve(55);
});
var p2 = new Promise(function(resolve, reject) {
    resolve(44);
});

Promise.all([p1, p2])
    .then(Function.apply.bind(
        function(x, y) {
            alert(x + ", " + y); // expecting popup with "55, 44"
        }, 
        null)
    );
);

谁能解释我做错了什么?

【问题讨论】:

  • 您必须使用Function.apply 吗?你可以简单地做Promise.all([p1, p2]).then(function( list ){ list.map() })
  • 不,当然不是。我只是想了解它在这个特定示例中的工作原理。
  • 显然您忘记了代码中的令牌bind。我想知道这怎么没有引发语法错误。
  • 我的错。粘贴了经过编辑的版本。但无论哪种方式都不起作用。
  • 你仍然有一个语法错误 - 一个右括号太多了。 ypur 问题到底是什么,您没有收到任何错误吗?

标签: javascript promise


【解决方案1】:

你没有调用 bind(),因为某种原因你把它省略了。

Promise.all([p1, p2])
    .then(Function.apply.bind(//correct
        function(x, y) {
            alert(x + ", " + y); // expecting popup with "55, 44"
        }, 
        null))
    );
);

这通过提供 apply 函数作为回调来工作,并将以下函数绑定为 thisArg。apply 的第二个参数将为 null。 thisArg 将被调用,基本上这意味着,提供的函数将由 apply 调用,没有参数。但随后“then”函数开始调用该函数,并使用它自己的参数,最后一部分是推测性的。

function(x, y) {
    alert(x + ", " + y); // expecting popup with "55, 44"
}

【讨论】:

  • 这不会弹出 "55,54" 因为 Promise.all 返回一个数组!
  • @Anonymous0day: Promise.all 返回一个数组的承诺
  • @Bergi 对!我的意思是在下一个then 中使用的参数将是一个数组。
  • @Anonymous0day: ...和绑定的apply 函数确实需要一个数组。这没有什么问题(除了多余的括号)。
  • @Bergi,再来一次你是对的!我专注于错误的事情,谢谢,对噪音感到抱歉!
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 2015-05-10
  • 2012-04-30
  • 2016-01-01
  • 2022-01-18
  • 2020-06-10
  • 2019-05-25
  • 2021-05-09
相关资源
最近更新 更多