Cách truyền tham số cho hàm hứa


122

Đây có vẻ là một câu hỏi ngớ ngẩn nhưng tôi là một người mới trong chủ đề này. Tôi đang làm việc với các lời hứa trên nút js. Và tôi muốn truyền tham số cho một hàm lời hứa. Tuy nhiên tôi không thể tìm ra nó.

someModule.someFunction.then(username, password,function(uid) {
  /*stuff */
}

và chức năng giống như

var someFunction = new Promise(username, password, function(resolve, reject) {
  /*stuff using username, password*/
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
});

1
Không có lý do gì để làm điều đó, bạn chỉ có thể xác định usernamepasswordở phạm vi cao hơn
adeneo

Nhưng tôi đang gọi lời hứa từ một mô-đun khác, tên người dùng và mật khẩu cũng không tĩnh mà đến từ phía máy khách. Có an toàn không khi xác định một số loại biến toàn cầu mà một hàm đặt và hàm kia sử dụng. Có rủi ro rằng biến bị thay đổi bởi khách hàng khác không?
kundante

1
@kundante Bạn không cần bất kỳ hình cầu nào. Tìm hiểu về việc đóng cửa.
SLaks

@adeneo lời hứa không đồng bộ - điều gì sẽ xảy ra nếu anh ta gọi hàm lần thứ hai trước khi lời hứa đầu tiên được giải quyết?
Mawg nói hãy phục hồi Monica vào

Câu trả lời:


234

Hãy gói Lời hứa của bạn bên trong một hàm hoặc nó sẽ bắt đầu thực hiện công việc của nó ngay lập tức. Ngoài ra, bạn có thể chuyển các tham số cho hàm:

var someFunction = function(username, password) {
  return new Promise(function(resolve, reject) {
    /*stuff using username, password*/
    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
}

Sau đó, sử dụng nó:

someModule.someFunction(username, password).then(function(uid) {
  /* stuff */
})

 

ES6:

const someFunction = (username, password) => {
  return new Promise((resolve, reject) => {
    /*stuff using username, password*/

    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
};

Sử dụng:

someModule.someFunction(username, password).then(uid => {
  /* stuff */
});

someModulegì?
Si8

3
Đó chỉ là một ví dụ từ OP
Shanoor 13/10/18

3
@Shanoor là uidgì? Có phải là chuỗi "Stuff đã hoạt động!" Không?
Old Geezer

2
@OldGeezer, nó chỉ là một biến để giữ lợi nhuận từ lời hứa. Trong trường hợp này, có, đó sẽ là "Nội dung đã hoạt động!".
Shanoor 19/07/19

bạn có biết cách gọi một hàm từ lớp cha trong lời hứa mới không?
TimeParadox

7

Một cách khác ( Phải thử ):

var promise1 = new Promise(function(resolve, reject) {
  resolve('Success!');
});
var extraData = 'ImExtraData';
promise1.then(function(value) {
  console.log(value, extraData);
  // expected output: "Success!" "ImExtraData"
}, extraData);


2
Ví dụ của bạn sẽ tốt hơn nếu bạn giải quyết bằng một mảng hoặc đối tượng mà bạn giải cấu trúc để nhiều đối số được hiển thị và lời hứa dài dòng được tạo đã được giải quyết như vậy: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465 Ngày

1
Tôi nghĩ rằng nó là sai vì tham số thứ hai được chuyển đến thenlà một lệnh gọi lại để xử lý giá trị trả về của hàm từ chối . Thay vì resolve('Success!');cố gắng reject('Error');Chúng tôi sẽ nhận được lỗi: Unhandled promise rejectionỞ đây chúng ta thấy đầu ra vì var extraData = 'ImExtraData';là một thế giới khác nhau và không phải vì đi qua nó sử dụngthen
Shakiba Moshiri

Nếu bạn không vượt qua nó, bạn không thể truy cập nó vì nó không có phạm vi trong lời hứa / sau đó nếu bạn không vượt qua nó.
sadiq

thử gỡ bỏ nó và xem nó có hoạt động hay không? codepen.io/k-five/pen/ZNOvKG xem bảng điều khiển đăng nhập trong trình duyệt của bạn
Shakiba Moshiri

Tôi đánh giá cao codepen của bạn, nhưng hãy sử dụng hai biến số khác nhau và sau đó xem hệ số thực! TRÁNH CÙNG BIẾN TẦN. Nếu chỉ cần biến toàn cục hoạt động tốt, chúng tôi không cần truyền thêm tham số.
sadiq

0

Bạn có thể sử dụng .bind () để truyền tham số ( this ) cho hàm.

var someFunction =function(resolve, reject) {
  /* get username, password*/
  var username=this.username;
  var password=this.password;
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
}
var promise=new Promise(someFunction.bind({username:"your username",password:"your password"}));

tôi có hàm này cách chỉnh sửa nó để chấp nhận .then()khi tôi gọi nó trong một Nút ` SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // Nhà cung cấp const {images} = this.state; images.map (image => {let file = image.uri; console.log (file); const path = "Img " + Math.floor (Math.random () * 1500); console.log ("@ IMAGE" , path); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (tệp);}); }; `@gogog
DevAS 14/07/19

@DevAS <button onclick = "then_ Chức năng (SaveImagesToFirebase.bind (this))"> </button> script là `var then_ Chức năng = function (promise) {new Promise (lời hứa) .then (function (e) {/ * code * /})}; chức năng SaveImagesToFirebase (quyết tâm, từ chối) {/ * Mã * / quyết tâm (/ * ??? * /);} `
gogog

0

Thậm chí ngắn hơn

var foo = (user, pass) =>
  new Promise((resolve, reject) => {
    if (/* condition */) {
      resolve("Fine");
    } else {
      reject("Error message");
    }
  });

foo(user, pass).then(result => {
  /* process */
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.