繁体   English   中英

如何使用确认警报并返回AJAX承诺?

[英]How to use confirm alert and return an AJAX promise?

我有一个返回AJAX Promise的现有函数。 我想更新此功能以在运行AJAX调用之前显示确认警报,但是代码的其他部分正在使用此功能,并且已经在期待一个承诺。

这是我原始功能的样子:

function doTheDeed() {
  return $.ajax({
    url: '/api/delete/123',
    method: 'POST'
  }).done(function () {
    alert('The deed is done.');
  });
}

doTheDeed().done(function {} { /*Do something else*/ });

现在,我想在运行AJAX调用之前与用户确认。 在等待用户确认或取消的同时如何保持退回的API协议?

function doTheDeed() {
  bootbox.confirm('Are you sure?', function (result) {
    if (result) {
      // Too late to return a promise, promise should've been returned a long time ago
      return $.ajax({
        url: '/api/delete/123',
        method: 'POST'
      }).done(function () {
        alert('The deed is done.');
      });
    } else {
      //return what??
    }
  });
}

doTheDeed().done(function {} { /*Do something else*/ });

我是否需要根据用户的响应有条件地返回不同的承诺?

您可以使用jQuery的Deferreds吗?

function doTheDeed() {
    var def = $.Deferred();

    bootbox.confirm('Are you sure?', def.resolve);

    return def.promise().then(function(result) {
        return result ? $.post('/api/delete/123') : "no go";
    });
}

doTheDeed().done(function (data) { 
    if (data == 'no go') {
        // user declined
    } else {
        // item deleted
    }
}).fail(function(err) {
    // something failed
});

建立在Adeneo的答案的基础上,并坚持最低级别承诺的原则,bootbox可以通过bootbox.confirm()的可重复使用promisification进行bootbox.confirm() ,而不必深入了解bootbox本身。

如果您这样做,则将是合适的:

  • 允许呼叫者指定质询文本和noGo消息。
  • 沿着错误路径发送noGo条件。
if(!bootbox.confirmAsync) {
    bootbox.confirmAsync = function (challenge, noGoMessage) {
        challenge = challenge || 'Are you sure?';
        noGoMessage = noGoMessage || 'User declined';
        return jQuery.Deferred(function (def) {
            bootbox.confirm(challenge, function (confirmed) {
                confirmed ? def.resolve() : def.reject(new Error(noGoMessage));
            });
        }).promise();
    }
}

然后, doTheDeed()将包含一个完全常规的then链,从bootbox.confirmAsync(...) ,例如:

function doTheDeed () {
    return bootbox.confirmAsync('Are you sure you want to delete?', 'User declined to delete')
    .then(function (data) {
        return $.post('/api/delete/123');
    })
    .then(null, function (err) {
        // if user declined, then 'User declined to delete' will come back as err.message
        console.log(err.message);
        return err; // jQuery v<3.0
        // throw err; // jQuery v>=3.0
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM