【问题标题】:Await is not working inside a method javascriptAwait 在方法 javascript 中不起作用
【发布时间】:2021-05-03 03:26:26
【问题描述】:

我有一个返回一些数据的 ajax 调用。代码是:

function ProductCodeLookUp() {
        return $.ajax({
            url: "/ProductInventory/GetProductCodeHirerchy",
            type: "get", //send it through get method
            async: false,
            data: {
                productCode: $('#ProductCodeText_Id').val()
            },
            success: function (response) {
                debugger;
                if (response != null && (response.tissueClassificationType != null || response.tissueClassificationType != null)) {
                    $('#productCodeTable_id').show();
                    $('#ProductCodeNotExistsWarning_id').hide();

                    //addOptionsToSelect(response, 'size_id', $('input[id=size_id]').val());
                    $('#ProductCodeTextClassification_Id').text(response.tissueClassificationType);
                    $('#ProductCodeTextTissueType_Id').text(response.tissueType);
                    $('#ProductCodeTextProduct_Id').text(response.tissueDefinition);
                    $('#ProductCodeTextSize_Id').text(response.tissueDefinitionSize);
                }
                else {
                    $('#ProductCodeNotExistsWarning_id').show();
                    $('#productCodeTable_id').hide();
                }
            },
            error: function (xhr) {
                //Do Something to handle error
            }
        });
    }

我必须根据这个 Ajax 调用返回的数据做出一些决定。我调用ProductCodeLookUp()方法的方法是:

async function checkRequiredFields() {
var isValid = false;
if (checkRequiredFieldsSubMethod() == true) {
            if (AddProductInBulk() == true) {
                if (QualityChecksValidation() == true) {
                    debugger;
                    var res = await ProductCodeLookUp();
                    if (res.tissueDefinitionSize != null)
                        isValid = true;
                    else
                        isValid = false;
                  }
                }
         }
        debugger;
        return isValid;
    }

问题是它不等待ProductCodeLookUp() 方法。我必须等待这个方法的结果,并根据结果来决定是返回真还是假。但我无法做到这一点。可能是什么问题。

【问题讨论】:

  • ProductCodeLookUp() 是否返回 Promise 以供 await 处理?
  • 是的,它确实返回了一个承诺。 @TimothyAlexisVass
  • 当你要等待“承诺”解决时,为什么要async: false
  • $.ajax 不返回承诺,而是返回它创建的 XMLHttpRequest 对象。您可以尝试自己返回承诺并在 success 处理程序中解决它。
  • @WiktorZychla $.ajax() 返回一个 $.Deferred 对象,这是一个类似 Promise 的对象,也适用于 await -> jsfiddle.net/fL5okpqm

标签: javascript ajax promise async-await


【解决方案1】:

将 ajax 调用包装在一个承诺中,该承诺在成功时解决并在错误时拒绝。

function ProductCodeLookUp() {
  return new Promise((resolve, reject) => $.ajax({
    // ...
    success: function (response) {
      // ...
      resolve();
    },
    error: function (response, status, err) {
       // ...
       reject(err);
    }
  }));
}   

另外,将 async 设置为 true

【讨论】:

  • 这是一种反模式。 JQuery Ajax 已经返回了一个 thenable。
猜你喜欢
  • 2018-06-09
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2011-01-29
  • 2018-09-13
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多