【问题标题】:Promises in JavascriptJavascript 中的承诺
【发布时间】:2016-05-31 16:07:57
【问题描述】:

我一直在查看有关如何使用 Promise 的各种讨论,但我没有得到任何工作。

我不断收到错误消息“无法读取未定义的属性。”

“那么”、“完成”等是 Javascript 内置的吗?还是他们要求我包含其他一些外部脚本?

这是我最近尝试使用 2 个简单的对话框(确认和拒绝都是简单的对话框):

var confirmWithPromise = Confirm(); 
var reject = confirmWithPromise.then(Reject("This record cannot be deleted."));

如果我可以从最简单的方法开始让我的示例工作,我想我可以从那里开始。

谢谢。

更新:这是我的 Confirm() - 它没有返回承诺。我不完全明白如何实现它的返回:

 function Confirm() {
    var buttons = [
{
    text: "Yes",
    //icons: {
    //    primary: "ui-icon-heart"
    //},
    click: function () {
        $(this).dialog("close");
        callback(true);
    }

    // Uncommenting the following line would hide the text,
    // resulting in the label being used as a tooltip
    //showText: false
},
{
    text: "No",
    //icons: {
    //    primary: "ui-icon-heart"
    //},
    click: function () {
        $(this).dialog("close");
        callback(false);
    }

    // Uncommenting the following line would hide the text,
    // resulting in the label being used as a tooltip
    //showText: false
}
    ];

    showDialog("Confirm", "Are you sure?  Once the record is deleted, it cannot be recovered.", buttons);

}

【问题讨论】:

  • Confirm 是否返回了一个 Promise? function Confirm() { return new Promise(...); }
  • 错误似乎很明显:Confirm 不返回任何内容。 ““那么”、“完成”等是 Javascript 内置的吗?” Promise 是 JavaScript 的一部分,是的。
  • 如果您提供了确认代码,我们可以看到它返回的内容

标签: javascript promise


【解决方案1】:

“那么”、“完成”等是 Javascript 内置的吗?

是的。它们是Promise objects 的方法,由the ES6 specification 定义。

我不断收到错误消息“无法读取未定义的属性。”

你只能在 Promise 对象上使用它们。该错误消息表明 Confirm 的返回值(它不是 JavaScript 内置的,尽管 confirm(带有 c 不是 C)作为 Web API 由浏览器提供)是 @ 987654328@ 而不是一个承诺对象。

您需要编辑 Confirm 以便它返回一个承诺。

【讨论】:

  • 我发布了我的确认功能。你能告诉我它应该如何修改吗?
  • 请注意,done没有内置于 JavaScript 和 will never be
【解决方案2】:

Promises 是最新规范的一部分,但并非所有浏览器都实现了它们——尤其是 IE11。您可以通过使用所谓的“promise polyfill”或使用通过“延迟”构造实现的 promise 的 jQuery 实现来克服这个问题——它本身不是 Promises 的实现,但它实现了一个非常相似的一般概念。

在您的情况下,您的“Confirm()”方法必须返回一个“承诺”对象。在 jQuery 中,Confirm 可能看起来像:

function Confirm(){
   var deferred = $.Deferred();

   ///do something interesting and asynchronous

   return deferred.promise();
}

一旦 promise 返回,“.then”元素就可用于在调用 deferred.reject()deferred.resolve() 时处理适当的回调。

【讨论】:

  • 建议 jQuery 实现是一个可怕的想法。
  • 因为?如果他的环境本身不支持 Promise 实现,他将需要走其他路线。他是否应该仅仅因为 jQuery 实现存在缺点而完全避免该承诺?我理解 jQuery 的实现并不理想的观点,但如果他没有原生替代方案......
  • @DavidW 1) OP 没有提到任何浏览器不兼容问题,所以我不确定你为什么要建议替代方案。 2) 他们应该使用real Promise 实现,例如bluebirdes6-promise
  • 由于我们最初并不知道 OP 的 Confirm 对话框的内容,因此推断他们尝试在未实现 Promises 的环境中使用 Promises 的可能性并非不合理,因此替代方案的建议。目的是提供帮助。伙计,这里的敌意情绪变得如此令人沮丧......
  • @DavidW 建议一个替代方案很好,但正如 Mike C 指出的那样,这是一个非常糟糕的建议替代方案。
猜你喜欢
  • 1970-01-01
  • 2016-04-14
  • 2017-06-18
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多