Trả lại kết quả org-babel từ một cuộc gọi không đồng bộ


7

Tôi hiện đang thử nghiệm chuyển nhiều quy trình phát triển của mình sang chế độ org để tôi có thể theo dõi tốt hơn những gì tôi đã thực hiện thử nghiệm. Tuy nhiên, một số bước liên quan đến các cuộc gọi không đồng bộ đến các dịch vụ RPC. Đoạn mã sau cho thấy vấn đề:

#+name: simple-async-example
#+begin_src emacs-lisp 
  (async-start
     ;; What to do in the child process
     (lambda ()
       (message "This is a test")
       (sleep-for 3)
       222)

     ;; What to do when it finishes
     (lambda (result)
       (format "Async process done - result should be 222: %s" result)))
#+end_src

#+RESULTS: simple-async-example
: #<process emacs>

Như bạn có thể thấy kết quả đến từ nhiệm vụ đầu tiên. Những gì tôi cần làm là nối thêm kết quả thực tế sau khi quá trình xử lý đã hoàn tất. Có bất kì cách nào để đạt được điều này không?


1
Ngoài tiêu đề, nó không thực sự rõ ràng câu hỏi của bạn là gì. Trả lời tiêu đề, tôi nghĩ rằng câu hỏi này xuất hiện thường xuyên trong danh sách email của Org và câu trả lời là "hiện không được hỗ trợ".
mankoff

@mankoff: OK Tôi đã diễn đạt lại và đơn giản hóa câu hỏi để thử làm cho dễ theo dõi hơn. Điều đó có tốt hơn không?
stsquad

vi.wikipedia.org/wiki/Minimal_Working_Example tại sao không có tập lệnh bash 3 dòng trả về một cái gì đó bất thường mà bất cứ ai cũng có thể chạy / kiểm tra / hiểu?
mankoff

@mankoff: bash vốn dĩ là đồng bộ phải không? Tôi đã gói tất cả các công cụ xây dựng và tải lên thành một tập lệnh để đơn giản hóa nó nhưng việc gửi công việc LAVA là một cái gì đó xảy ra không đồng bộ trong các emacs.
stsquad

@mankoff: Làm thế nào là ví dụ duy nhất mới?
stsquad

Câu trả lời:


4

OK Giải quyết ví dụ (không đồng bộ) Tôi đã nghĩ ra cách hack này. Sẽ thật tuyệt nếu tôi có thể tự động lấy tên của khối nguồn thay vì phải lặp lại nó dưới dạng var.

** Post-modify the org-result
#+name: simple-async-with-post-modify
#+begin_src emacs-lisp :var this-buffer=(buffer-name (current-buffer)) this-name="simple-async-with-post-modify"
  (async-start
     ;; What to do in the child process
   `(lambda ()
     (message "This is a test")
     (sleep-for 3)
     ,(async-inject-variables "this-buffer")
     ,(async-inject-variables "this-name")
     (list
        (cons 'buffer this-buffer)
        (cons 'name this-name)
        (cons 'result 222)))

     ;; What to do when it finishes
   (lambda (result)
     (let ((buf (cdr (assoc 'buffer result)))
           (name (cdr (assoc 'name result)))
           (res (cdr (assoc 'result result))))
       (save-excursion
         (with-current-buffer buf
           (org-babel-goto-named-result name)
           (next-line)
           (goto-char (org-babel-result-end))
           (org-babel-insert-result (format "we got: %s" res)))))))
#+end_src

#+RESULTS: simple-async-with-post-modify
: #<process emacs>
: we got: 222

1
Chào. Có một bài đăng của John Kitchin thảo luận về một giải pháp nguyên mẫu cho các khối mã python có thể thú vị với bạn.
dfeich
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.