javascript - AJAX - 带有嵌套的 promise

标签 javascript jquery ajax

var preadd = $.ajax({
  type: 'POST',
  url: url,
  data: {
    some data
  },
  success: function(output) {

    if (output != 12 && output != 13) {

      some code here...

      var arr = [];
      arr.push.apply(arr, val.split(","));
      arr.splice(-1, 1);
      for (var i = 0; i < arr.length; i++) {
        arr[i] = arr[i].trim();
      }
      chk dup1 is another ajax
      function outside
      var chk = chkdup1();
      console.log(chk);
      chk.then(function() {
        if (result == 13) {

          rem = confirm("Duplicate data will be removed, are you sure!");
          if (rem == false) {
            return false;
          }
          if (rem == true) {
            remdens1();
          }
        }
      });
    }
    if (output == 13) {
      rem = confirm("Duplicate data will be removed, are you sure!");
      if (rem == true) {
        remdens1();
      }
    }

    if (output == 12) {
      $('#valensdata').html("success").css('color', 'green');
    }
    return rem;
  }
});

preadd.then(function() {
  console.log(rem);
  if (rem == false) {
    return false;
  }

  fnensadd();

});
  1. 即使我在 preadd 的 .then 函数中按确认中的取消,
  2. 我无法获取存储在 rem 变量中的值。
  3. 即使返回 false,底部的 preadd.then 函数也会执行。

任何人都可以指导我吗?

最佳答案

即使我在确认中按下取消。然后 preadd 的功能:

     Promise Preadd has no knowledge of cancel. You are returning a value false when cancel is clicked.     

我无法获取存储在 rem 变量中的值。

 Assuming rem is a local variable of success function, the variable dies when success function is completed. A bad way of coding would be creating rem in  larger scope , eg sibling of preadd

即使返回 false,底部的 preadd.then 函数也会执行。

resolveCB of preadd.then( resolveCB, rejectCB) will always be called unless an until there is some error or promise is rejected. Returning false is not same as rejecting promise.   

说完这句话后,要么用“然后”,要么用“成功”。如果你想防止 CB Hell,请始终使用 Promise。

带有 Promise 的更好的代码结构如下

var preadd = $.ajax({
   type: 'POST',
   url: url,
   data: {
     some data
  }

preadd.then(function() {
     // Success of PreAdd
          return chkdup1() 
}).then(function(){
    // Success of chkdup1
    //by some internal logic build rem
    if(rem)
    return Promise.resolve(rem )
    return Promise.reject(rem)
}).then(function(data){

     // rem was true
      fnensadd();
},function(error){
    // rem was false

 });

关于javascript - AJAX - 带有嵌套的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42116375/

相关文章:

javascript - 动态 Web 表单包含在 jQuery 中切换

jquery - 交换两个文本框的值

javascript - 未定义索引 PHPMailer 表单

javascript - 在 erb 中的 <% %> 内使用 javascript 变量 - Ruby on Rails

javascript - 链接谷歌表格以自动创建日历事件并在更新谷歌表格时更新它们

javascript - 滚动经过 x-px 时删除类(从底部开始)

javascript - Jquery/Javascript - 变量正在获取另一个变量值

javascript - Rails 评论不使用 ajax 呈现

jquery - 通过ajax使用动态创建的数据刷新div

javascript - MVC 远程验证后调用函数