簡體   English   中英

函數在一個參數上關閉,另一個從承諾返回?

[英]Functions with closure on one argument and the other a return from a promise?

我正在努力處理涉及一組承諾中的閉包的代碼塊。 這個例子說明了這個問題。 問題是讓這三個 promise 示例中的最后一個在q上有一個閉包並使用 promise 的結果。 前兩個工作似乎是因為承諾的成功處理程序只是沒有任何其他參數的閉包函數,這意味着承諾的結果沒有明確作為參數傳遞。 第三個 promise 的成功函數嘗試傳遞結果對象的屬性,但這導致q上沒有閉包。 目標是讓q為 5 而不是 7。我很抱歉,因為我確信我使用了所有錯誤的編碼術語。

你能解釋一下我缺少什么嗎? 謝謝你。

let q = 1;
let f = (function (x) {
  return function (r) {
    result(x, r);
  }
})(q);

q = 5;

promise_test().then((r) => {
  f(r);
}, () => { });

promise_test().then((function (x) {
  return function (r) {
    result(x, r);
  }
})(q), () => { });

promise_test_obj().then((o) => (function (x) {
  return function (r) {
    result(x, r);
  }
})(q)(o.m), () => { });

q = 7;

function promise_test() {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      resolve('promise test resolved');
    }, 100);
  });
}

function promise_test_obj() {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      resolve({ 'm': 'promise test_obj resolved' });
    }, 100);
  });
}

function result(a, r) {
  console.log('q : ' + a + ', r : ' + r);
}

省略所有不必要的 IIFE 混亂,你基本上有

q = 1,
f = (…)(q);

q = 5;
….then((…)(q));

….then(o => (…)(q)(o.m));
q = 7;

不同之處在於,在第三個示例中, q變量在o => …箭頭函數內求值,該函數在q = 7賦值后異步調用。 相反,其他兩個立即評估q ,因此它分別取值15

要解決這個問題,寫

f = (function(x) {
  return o => result(x, o.m)
}(q); // here q is still 5
promise_test_obj().then(f);

另請參閱關閉不起作用

promise_test_obj例子中傳遞給then方法的函數,當外部作用域中q的值設置為7時,會在100ms后執行。

  o =>
    (function(x) {
      return function(r) {
        result(x, r);
      };
    })(q)(o.m),

因此,在使用參數{ m: "promise test_obj resolved" }調用此函數時, q值為 7。上面示例中的以下代碼:

(function(x) {
      return function(r) {
        result(x, r);
      };
    })(q)

被異步調用,而在其他 2 個示例中,它被同步調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM