2010-10-15 41 views
28

Tôi có một hàm js, sau khi làm một số logic kinh doanh, chức năng javascript nên trả về kết quả một số người khác đang variable.Sample dướiassign hàm trả về giá trị cho một số biến sử dụng javascript

var response=""; 
function doSomething() { 
    $.ajax({ 
     url:'action.php', 
     type: "POST", 
     data: dataString, 
     success: function (txtBack) { 
      if(txtBack==1) { 
       status=1; 
      } 
    }); 
    return status;  
} 

Ở đây tôi muốn sử dụng giống như

Tôi muốn gán giá trị trả lại "trạng thái" "phản hồi var" .Xin kết quả là 'không xác định' Vui lòng giúp tôi khắc phục điều này.

Xin cảm ơn trước.

+0

Đã nhận đúng từ ngữ trong tiêu đề của bạn: * giá trị trả lại *. Nhưng bạn không sử dụng 'return' trong hàm của bạn;) –

+0

Lưu ý rằng thông thường bạn không cần khởi tạo các biến mới với các giá trị nếu các giá trị đó là false (một chuỗi rỗng). Bạn chỉ có thể viết: trả lời var; Giá trị của phản hồi sẽ được đặt thành giá trị không xác định trong trường hợp này (cũng là giá trị giả).Sau đó, khi bạn muốn kiểm tra xem giá trị đã được đặt chưa, bạn chỉ có thể kiểm tra xem nó có bị lỗi hay không ... –

+0

@Felix: tôi có cuộc gọi ajax bên trong hàm, nó sẽ trả về "không xác định". bất kỳ ý tưởng? Cảm ơn –

Trả lời

6

Bạn chỉ có thể trả về một giá trị từ chức năng:

var response = 0; 

function doSomething() { 
    // some code 
    return 10; 
} 
response = doSomething(); 
+0

Hoạt động của nó ... nhưng tôi có cuộc gọi ajax bên trong, trong thời gian đó kết quả là 'không xác định'. Bất kỳ ý tưởng? Vui lòng xem mã mẫu đã sửa đổi. –

48

Hoặc chỉ cần ...

var response = (function() { 
    var a; 
    // calculate a 
    return a; 
})(); 

Trong trường hợp này, biến phản ứng nhận giá trị trả về của hàm. Hàm thực thi ngay lập tức.

Bạn có thể sử dụng cấu trúc này nếu bạn muốn điền biến có giá trị cần được tính toán. Lưu ý rằng tất cả phép tính xảy ra bên trong hàm ẩn danh, do đó bạn không gây ô nhiễm không gian tên chung.

+0

Đối với tò mò, điều này được gọi là một * ngay lập tức gọi hàm express * (IIFE). Và nó thật tuyệt vời. – Scribblemacher

+0

Lưu ý rằng bản thân hàm nằm bên trong dấu ngoặc đơn (có một dấu ngoặc đơn mở trước từ 'hàm') và có thêm một'() 'ở cuối. (Lúc đầu tôi không rõ ràng) – J0ANMM

14

Yêu cầu AJAX không đồng bộ. Hàm doSomething của bạn đang được gỡ bỏ, yêu cầu AJAX đang được thực hiện nhưng nó xảy ra không đồng bộ; do đó phần còn lại của doSomething được thực hiện và giá trị của status là không xác định khi nó được trả về.

hiệu quả, mã của bạn hoạt động như sau:

function doSomething(someargums) { 
    return status; 
} 

var response = doSomething(); 

Và rồi một thời gian sau đó, yêu cầu AJAX của bạn là hoàn thành; nhưng đã quá muộn

Bạn cần thay đổi mã của mình và điền biến "phản hồi" trong gọi lại "thành công" của yêu cầu AJAX của bạn. Bạn sẽ phải trì hoãn việc sử dụng phản hồi cho đến khi cuộc gọi AJAX hoàn tất.

Nơi bạn trước đó có thể đã có

var response = doSomething(); 

alert(response); 

Bạn nên làm:

function doSomething() { 
    $.ajax({ 
      url:'action.php', 
      type: "POST", 
      data: dataString, 
      success: function (txtBack) { 
      alert(txtBack); 
      }) 
    }); 
}; 
1

Cách duy nhất để lấy lại giá trị đúng trong bối cảnh của bạn là chạy $.ajax() chức năng đồng bộ (những gì thực sự mâu thuẫn đến ý tưởng chính của AJAX). Có thuộc tính cấu hình đặc biệt async bạn nên đặt thành false. Trong trường hợp đó, phạm vi chính thực sự chứa $.ajax() cuộc gọi chức năng bị tạm dừng cho đến khi chức năng đồng bộ được thực hiện, do đó, return chỉ được gọi sau $.ajax().

function doSomething() { 
    var status = 0; 
    $.ajax({ 
     url: 'action.php', 
     type: 'POST', 
     data: dataString, 
     async: false, 
     success: function (txtBack) { 
      if (txtBack == 1) 
       status = 1; 
     } 
    }); 

    return status; 
} 

var response = doSomething(); 
Các vấn đề liên quan